﻿using System;
using web_uchet.Models;
using System.Linq;
using System.Collections.Generic;
using Mvc.Validation.Validators;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;
using web_uchet.Security;
using web_uchet.StringResources;
namespace web_uchet.ViewModels
{
    public interface IViewКлиент
    {
        Клиент Клиент { get; }
        System.Data.Objects.DataClasses.EntityCollection<Заказ> Заказы { get; set; }
        int ИД_Клиент { get; }
        string Имя { get; set; }
        Компания Компания { get; set; }
        int ИД_Компании { get; set; }
        System.Data.Objects.DataClasses.EntityReference<Компания> КомпанияReference { get; set; }
        string ОписаниеКлиента { get; set; }
    }
    [System.Web.Mvc.Bind(Exclude = "ИД_Клиент,ИД_Компании")]
    public class ViewКлиент : IViewКлиент
    {
        private Клиент _Клиент;
        public Клиент Клиент { get { return this._Клиент; } }
        public ViewКлиент()
        {
            this._Клиент = new Клиент();
            this.КомпанияReference.EntityKey = new System.Data.EntityKey("ModelWebUchetCon.Компании", "ИД_Компании", 0);
        }
        public ViewКлиент(Клиент Base)
        {
            this._Клиент = Base;
        }

        #region IViewКлиент Members
        public int ИД_Компании
        {
            get { return Convert.ToInt32(this.КомпанияReference.EntityKey.EntityKeyValues.First(e => e.Key == "ИД_Компании").Value); }
            set { this.КомпанияReference.EntityKey = new System.Data.EntityKey("ModelWebUchetCon.Компании", "ИД_Компании", value); }
        }

        public System.Data.Objects.DataClasses.EntityCollection<Заказ> Заказы
        {
            get
            {
                return this._Клиент.Заказы;
            }
            set
            {
                this._Клиент.Заказы = value;
            }
        }

        public int ИД_Клиент
        {
            get { return this._Клиент.ИД_Клиент; }
        }
        [NotNullOrEmptyValidator(MessageTemplate="Введите ФИО клиента")]
        [StringLengthValidator(60, MessageTemplate = ValidationStringResources.StringLength60ValidationMessage)]
        public string Имя
        {
            get
            {
                return this._Клиент.Имя;
            }
            set
            {
                if (value == null) this._Клиент.Имя = string.Empty;
                else
                    this._Клиент.Имя = value;
            }
        }

        public Компания Компания
        {
            get
            {
                return this._Клиент.Компания;
            }
            set
            {
                this._Клиент.Компания = value;
            }
        }

        public System.Data.Objects.DataClasses.EntityReference<Компания> КомпанияReference
        {
            get
            {
                return this._Клиент.КомпанияReference;
            }
            set
            {
                this._Клиент.КомпанияReference = value;
            }
        }
        [StringLengthValidator(100, MessageTemplate = ValidationStringResources.StringLength100ValidationMessage)]
        public string ОписаниеКлиента
        {
            get
            {
                return this._Клиент.Описание;
            }
            set
            {
                if (value == null) this._Клиент.Описание = string.Empty;
                else
                    this._Клиент.Описание = value;
            }
        }

        [StringLengthValidator(40, MessageTemplate = ValidationStringResources.StringLength40ValidationMessage)]
        public string EMail
        {
            get { return this._Клиент.EMail; }
            set 
            {
                if (value == null) this._Клиент.EMail = string.Empty;
                else
                    this._Клиент.EMail = value;
            }
        }
        [StringLengthValidator(30, MessageTemplate = ValidationStringResources.StringLength30ValidationMessage)]
        public string Skype
        {
            get { return this._Клиент.Skype; }
            set
            {
                if (value == null) this._Клиент.Skype = string.Empty;
                else
                    this._Клиент.Skype = value;
            }
        }
        [StringLengthValidator(45, MessageTemplate = ValidationStringResources.StringLength45ValidationMessage)]
        public string Адрес
        {
            get { return this._Клиент.Адрес; }
            set
            {
                if (value == null) this._Клиент.Адрес = string.Empty;
                else
                    this._Клиент.Адрес = value;
            }
        }
        [StringLengthValidator(60, MessageTemplate = ValidationStringResources.StringLength60ValidationMessage)]
        public string Должность
        {
            get { return this._Клиент.Должность; }
            set
            {
                if (value == null) this._Клиент.Должность = string.Empty;
                else
                    this._Клиент.Должность = value;
            }
        }
        [StringLengthValidator(45, MessageTemplate = ValidationStringResources.StringLength45ValidationMessage)]
        public string Контакты_Другие
        {
            get { return this._Клиент.Контакты_Другие; }
            set
            {
                if (value == null) this._Клиент.Контакты_Другие = string.Empty;
                else
                    this._Клиент.Контакты_Другие = value;
            }
        }
        [StringLengthValidator(40, MessageTemplate = ValidationStringResources.StringLength40ValidationMessage)]
        public string Название_Компании
        {
            get { return this._Клиент.Название_Компании; }
            set
            {
                if (value == null) this._Клиент.Название_Компании = string.Empty;
                else
                    this._Клиент.Название_Компании = value;
            }
        }
        [StringLengthValidator(30, MessageTemplate = ValidationStringResources.StringLength30ValidationMessage)]
        public string Тел_Моб
        {
            get { return this._Клиент.Тел_Моб; }
            set
            {
                if (value == null) this._Клиент.Тел_Моб = string.Empty;
                else
                    this._Клиент.Тел_Моб = value;
            }
        }
        [StringLengthValidator(30, MessageTemplate = ValidationStringResources.StringLength30ValidationMessage)]
        public string Тел_Раб
        {
            get { return this._Клиент.Тел_Раб; }
            set
            {
                if (value == null) this._Клиент.Тел_Раб = string.Empty;
                else
                    this._Клиент.Тел_Раб = value;
            }
        }
        #endregion
    }

    public class ViewКлиентOperationProvider
    {
        private ModelWebUchetCon _Context;
        private ProgramContext _SecurityContext;

        public ViewКлиентOperationProvider(ProgramContext SecurityContext)
        {
            this._Context = new ModelWebUchetCon(ModelWebUchetCon.SingleToneConnection);
            this._SecurityContext = SecurityContext;
        }
        public ViewКлиентOperationProvider(ModelWebUchetCon Context, ProgramContext SecurityContext)
        {
            this._Context = Context;
            this._SecurityContext = SecurityContext;
        }

        //v CompanyID - ID компании для которой делаем LIST
        public IEnumerable<ViewКлиент> List()
        {
            var Clients= this._Context.Клиенты.Where(e => e.Компания.ИД_Компании == this._SecurityContext.CompanyID).OrderBy(e=>e.Имя).ToList();
            Clients.Remove(Clients.First(e=>e.Имя=="Нет"));
            return Clients.Select(e => new ViewКлиент(e));
        }
        public IQueryable<Клиент> IQueryableClients()
        {
            return this._Context.Клиенты.Where(e => e.Компания.ИД_Компании == this._SecurityContext.CompanyID
                && e.Имя != "Нет");
        }
        public ViewКлиент Details(int ClientID, ProgramContext SecurirtyData)
        {
            ViewКлиент NeededClient =
                new ViewКлиент(this._Context.Клиенты.First(e => e.ИД_Клиент == ClientID));
            if (Convert.ToInt32(
                NeededClient.КомпанияReference.EntityKey.EntityKeyValues.First(e => e.Key == "ИД_Компании").Value) == SecurirtyData.CompanyID)
                return NeededClient;
            else throw new System.Security.SecurityException("Попытка получить данные чужой компании");
        }
        //Disable User
        public void Delete(int ClientID, ProgramContext SecurirtyData)
        {
            Клиент ObjectToDelete = this.Details(ClientID, SecurirtyData).Клиент;
            Клиент NoClient = this._Context.Клиенты.First(e => e.Компания.ИД_Компании == SecurirtyData.CompanyID &&
                e.Имя == "Нет");
            foreach (Заказ Cl in
            this._Context.Заказы.Where(e => e.Клиент.ИД_Клиент == ClientID))
                Cl.Клиент = NoClient;

            this._Context.DeleteObject(ObjectToDelete);
            this.SaveChanges();
        }

        public void Create(ViewКлиент NewViewКлиент, ProgramContext SecurirtyData)
        {
            NewViewКлиент.ИД_Компании = SecurirtyData.CompanyID;
            this._Context.AddToКлиенты(NewViewКлиент.Клиент);
            this.SaveChanges();
        }
        public void SaveChanges()
        {
            this._Context.SaveChanges(true);
        }
    }
}
